//#region License
//// Copyright (c) 2007, James Newton-King
//// All rights reserved.
////
//// Redistribution and use in source and binary forms, with or without
//// modification, are permitted provided that the following conditions are met:
////     * Redistributions of source code must retain the above copyright
////       notice, this list of conditions and the following disclaimer.
////     * Redistributions in binary form must reproduce the above copyright
////       notice, this list of conditions and the following disclaimer in the
////       documentation and/or other materials provided with the distribution.
////     * Neither the name of the Newtonsoft nor the
////       names of its contributors may be used to endorse or promote products
////       derived from this software without specific prior written permission.
////
//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
//// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
//// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
//// DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
//// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
//// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
//// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
//// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//#endregion

//using System;
//using System.ServiceModel;

//namespace Utilities.Services
//{
//  public static class ServiceUtils
//  {
//    public delegate TReturn Action<TArg, TReturn>(TArg obj);

//    public static TReturn MakeCalls<TProxy, TChannel, TReturn>(Action<TProxy, TReturn> action)
//      where TProxy : ClientBase<TChannel>, new()
//      where TChannel : class
//    {
//      TProxy proxy = new TProxy();

//      try
//      {
//        return action(proxy);
//      }
//      finally
//      {
//        Dispose(proxy);
//      }
//    }

//    public static void MakeCalls<TProxy, TChannel>(Action<TProxy> action)
//      where TProxy : ClientBase<TChannel>, new()
//      where TChannel : class
//    {
//      Action<TProxy, object> temp = delegate(TProxy proxy)
//                                    {
//                                      action(proxy);
//                                      return null;
//                                    };

//      MakeCalls<TProxy, TChannel, object>(temp);
//    }

//    public static void Dispose(ICommunicationObject channel)
//    {
//      if (channel != null)
//      {
//        try
//        {
//          if (channel.State != CommunicationState.Faulted)
//            channel.Close();
//          else
//            channel.Abort();
//        }
//        catch (CommunicationException)
//        {
//          channel.Abort();
//        }
//        catch (TimeoutException)
//        {
//          channel.Abort();
//        }
//        catch (Exception)
//        {
//          channel.Abort();
//          throw;
//        }
//      }
//    }
//  }
//}